#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include "Lienzo.h"
#include "UtilidadesSVG.h"

using namespace std;


/** \file Lienzo.cc
 * \brief Fichero con los métodos de la clase Lienzo.
 *
 *	En este fichero tenemos las implementaciones de los métodos que constituyen la clase lienzo. Estos son: La forma canónica, y sus sobrecargas de
 *	operadores.
 *	JAVIER ANTON DIAZ DNI:48629698Q
 *	STANISLAV LITVINENKO DNI:02062226T
 */



Lienzo::Lienzo( string ptitulo, float pancho, float palto )
{
	titulo = ptitulo;
	if(pancho < 0)
	{
		throw ExcepcionValorNoValido(pancho, "ExcepcionValorNoValido: el ancho de lienzo debe ser positivo");
	}
	else
	{
		ancho = pancho;
	}

	if(palto < 0)
	{
		throw ExcepcionValorNoValido(palto, "ExcepcionValorNoValido: la altura de lienzo debe ser positiva");
	}
	else
	{	
		alto = palto;

	}
}

Lienzo::~Lienzo() {
	int i=0;

	if(!figuras.empty())
	{
		for(i=0; i < (int)figuras.size(); i++)
		{
			//IDibujable* tipo = figuras[i];
			/*if(dynamic_cast<Figura2D*>(figuras[i]))
			{
				//figuras[i]->~IDibujable();
				//figuras[i]->~Figura2D();
			}
			else if(dynamic_cast<GrupoFiguras*>(figuras[i]))
			{
				//figuras[i]->~IDibujable();
				//figuras[i]->~GrupoFiguras();
			}*/

			delete figuras[i];

		}
		figuras.clear();
	}
	
	titulo = "";
	ancho = 0.0;
	alto = 0.0;
}


float
Lienzo::getAncho() const{
	return this->ancho;
}


float
Lienzo::getAlto() const{
	return this->alto;
}


istream&
operator>>(istream& is, Lienzo& plienzo) {
	
	string sub="",titulo="", aux = "";
	float lancho=0.0,lalto=0.0;


	/*getline(is,aux);
        
	found=aux.find(" ");//buscamos la posicion del primer espacio
	sub=aux.substr(0,found);//extraemos el primer valor (ancho del lienzo)

	lancho=atof(sub.c_str());*/
	is>>lancho;
	
	if(lancho < 0)
	{
		throw ExcepcionValorNoValido(lancho, "ExcepcionValorNoValido: el ancho de lienzo debe ser positivo");
	}
	else
	{
		plienzo.ancho=lancho;
	}
	
	/*found2=aux.find(" ",found+1);
	sub=aux.substr(found+1,found2-found);

	lalto=atof(sub.c_str());*/
	is>>lalto;

	if(lalto < 0)
	{
		throw ExcepcionValorNoValido(lancho, "ExcepcionValorNoValido: la altura de lienzo debe ser positiva");
	}
	else
	{
		plienzo.alto=lalto;
	}

	getline(is,titulo);
	titulo = titulo.substr(1, titulo.length());
	plienzo.titulo = titulo;
	//is>>titulo;
	//plienzo.titulo=titulo;
	/*sub=aux.substr(found2+1);
	plienzo.titulo=sub;*/

		while(is>>sub)
		{
			try
			{
				if(sub=="Circulo")
				{
					IDibujable* fig = UtilidadesSVG::crearFigura("Circulo",is);
					plienzo.figuras.push_back(fig);
				}
				else if(sub=="Rectangulo")
				{
					IDibujable* fig = UtilidadesSVG::crearFigura("Rectangulo",is);
					plienzo.figuras.push_back(fig);
				}
				else if(sub=="HACER")
				{
					UtilidadesSVG::hacerOperacion(plienzo.figuras,is);
				}
				else
				{					throw ExcepcionFiguraDesconocida(sub);
				}
			}
			catch (ExcepcionFiguraDesconocida& e)
			{
				if( !is.eof() )
				{
					getline(is,aux);
				}
				cerr<<e.what() << endl;
			}
			catch(ExcepcionValorNoValido &v)
			{
				if( !is.eof() )
				{
					getline(is,aux);
				}
				cerr << v.what() << endl;
			}
			catch(ExcepcionCoordenadaErronea &s)
			{
				cerr << s.what() << endl;
			}
		
		}

		return is;
}


ostream&
operator<<(ostream& os, const Lienzo& plienzo) {

	os << "<?xml version=\"1.0\"?>\n<svg width=\""<< plienzo.getAncho() <<"\" height=\""<< plienzo.getAlto() << "\"\n version=\"1.2\" baseProfile=\"tiny\" xmlns=\"http://www.w3.org/2000/svg\">\n";
	os << " <desc>" << plienzo.titulo << "</desc>" << endl;

	for( int i =0; i < (int)plienzo.figuras.size(); i++)
	{
		if( plienzo.figuras[i] != NULL )
		{
			if(plienzo.figuras[i]->puedoPintarme())
			{
				plienzo.figuras[i]->pintar(os);
				os << endl;
			}
		}
	}	

	os << "</svg>" << endl;

	return os;
}
